﻿function Get-BinariesRepository
{
    [cmdletbinding(DefaultParameterSetName="none")]
    Param( 
        [Parameter(Mandatory=$true,ValueFromPipeline=$false)]
        [String]$UniqueKey

    )
    Begin
    {
        $watch = [system.diagnostics.stopwatch]::StartNew() 
        write-verbose "Start Get-BinariesRepository with uniqueKey $UniqueKey"
    }
    End
    {
        write-verbose "End Get-BinariesRepository with uniqueKey $UniqueKey"
        $watch.Stop();
        Write-Verbose "Function duration : $($watch.Elapsed)"
    }

    Process
    {

        $BinariesRepository = $ApplicationManifest.Binaries.BinariesRepositories.$($uniqueKey)

        if (-not $BinariesRepository)
        {
            throw New-Object System.Exception "Binaries Repository with uniqueKey $uniqueKey is not defined"                        
        }

        $BinariesRepository | Add-Member -MemberType ScriptMethod -Name GetRemotePath -Value {
           .{
                param (	
                    [Parameter(Mandatory=$true)]
                    [ValidateNotNullOrEmpty()]
	                [PSObject]$Product
                )
                Process
                {
                    $path = $this.Share
                    $path = [System.IO.Path]::Combine($path, $Product.companyName)
                    $path = [System.IO.Path]::Combine($path, $Product.productName)
                    $path = [System.IO.Path]::Combine($path, $Product.version)
                    $path = [System.IO.Path]::Combine($path, $Product.packageName)
                    Write-Output $path

                }
            } @args 
        }




        Write-Output $BinariesRepository
    }
}


<######################################################################################################################################################################
    Begin DscFileSynchronisation : Migrated to convertto-DscFileSynchronisation
    => Object Model compatible with Buitin Dsc File
######################################################################################################################################################################>
$global:DscFileSynchronisation =
        @{n='UniqueKey';e={Get-Value -Object $_ -Value $_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='DestinationPath';e={Get-FullPath -Object $_}},
        @{n='SourcePath';e={Get-Value -Object $_ -Value $_.Source}}
<######################################################################################################################################################################
    End DscEnvironmentVariable
######################################################################################################################################################################>




<######################################################################################################################################################################
    Begin DscEnvironmentVariable : Migrated to convertto-DscEnvironmentVariable
    => Object Model compatible with Buitin Dsc Resource Environment
######################################################################################################################################################################>
$global:DscEnvironmentVariable =
        @{n='UniqueKey';e={Get-Value -Object $_ -Value $_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='Name';e={Get-Value -Object $_ -Value $_.Name}},
        @{n='Path';e={
                (($_.Parent.ElementType -eq 'folder') -or ($_.Parent.ElementType -eq 'file'))
            }
         },
        @{n='Value';e={Get-EnvironmentVariable -EnvironmentVariable $_}},
        @{n='MergePattern';e={
                if ($_.MergePattern) {$_.MergePattern}
                else {";"}
            }
         }
<######################################################################################################################################################################
    End DscEnvironmentVariable
######################################################################################################################################################################>


<######################################################################################################################################################################
    Begin DscRegistryObject : 
    => Object Model compatible with Buitin Dsc Resource Registry
######################################################################################################################################################################>
$global:DscRegistryObject =
        @{n='UniqueKey';e={Get-Value -Object $_ -Value $_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='Key';e={Get-Value -Object $_ -Value $_.Key}},
        @{n='ValueType';e={$_.ValueType}},
        @{n='ValueName';e={Get-Value -Object $_ -Value $_.ValueName}},
        @{n='ValueData';e={Get-RegistryValue -Registry $_}},
        @{n='MergePattern';e={
                if ($_.MergePattern) {$_.MergePattern}
                else {"`r`n"}
            }
         }
<######################################################################################################################################################################
    End DscRegistryObject
######################################################################################################################################################################>


<######################################################################################################################################################################
    Begin DscProductDownload : 
    => Object Model compatible with Buitin Dsc Resource File
######################################################################################################################################################################>
$global:DscProductDownload = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='RemotePath';e={
                $binaryRepository = Get-BinariesRepository $_.binariesRepository
                $binaryRepository.GetRemotePath($_)
            }
        },
        @{n='LocalPath';e={

                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if ($sourceDirectory)
                {
                    $sourceDirectoryPath = Get-FullPath -Object $sourceDirectory
                    $path = [System.IO.Path]::Combine($sourceDirectoryPath, $_.packageName)
                    Write-Output $path
                }
            }
        },
        @{n='NetworkLocalPath';e={

                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if ($sourceDirectory -and (![String]::IsNullOrEmpty($sourceDirectory.share)))
                {
                    $networkPath = [System.IO.Path]::Combine("\\",$Server.hostName, $sourceDirectory.share)
                    $path = [System.IO.Path]::Combine($networkPath, $_.packageName)
                    Write-Output $path
                }
            }
        },
        @{n='AutoDownload';e={
                $server = Get-Server -CurrentObject $_
                $server.AutoDownload
            }
        }

<######################################################################################################################################################################
    End DscProductDownload : 
######################################################################################################################################################################>


<######################################################################################################################################################################
    Begin DscProductArchiveInstaller : 
    => Object Model compatible with Buitin Dsc Resource Archive
######################################################################################################################################################################>
$global:DscProductArchiveInstaller = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='LocalPath';e={

                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if ($sourceDirectory)
                {
                    $sourceDirectoryPath = Get-FullPath -Object $sourceDirectory
                    $path = [System.IO.Path]::Combine($sourceDirectoryPath, $_.packageName)
                    Write-Output $path
                }
            }
        },
        @{n='Destination';e={
                Get-FullPath $_.Folders.InstallationDirectory
            }
        }

<######################################################################################################################################################################
    End DscProductArchiveInstaller : 
######################################################################################################################################################################>

<######################################################################################################################################################################
    Begin DscWarInstallerObject : 
    => Object Model compatible with Builtin Dsc Resource File
######################################################################################################################################################################>
$global:DscWarInstallerObject = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='LocalPath';e={

                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if ($sourceDirectory)
                {
                    $sourceDirectoryPath = Get-FullPath -Object $sourceDirectory
                    $path = [System.IO.Path]::Combine($sourceDirectoryPath, $_.packageName)
                    Write-Output $path
                }
            }
        },
        @{n='Destination';e={
                #Get the Application Directory for Tomcat webApps
                $applicationDirectoryPath = Get-Value -Object $_ -Value (Get-FullPath -Object $_.Container.Folders.ApplicationDirectory)
                [System.IO.Path]::Combine($applicationDirectoryPath, $_.packageName)
            }
        }

<######################################################################################################################################################################
    End DscWarInstallerObject : 
######################################################################################################################################################################>


<######################################################################################################################################################################
    Begin DscProductPackageInstaller : 
    => Object Model compatible with Buitin Dsc Resource Package
######################################################################################################################################################################>
$global:DscProductPackageInstaller = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='LocalPath';e={

                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if ($sourceDirectory)
                {
                    $sourceDirectoryPath = Get-FullPath -Object $sourceDirectory
                    $path = [System.IO.Path]::Combine($sourceDirectoryPath, $_.packageName)
                    Write-Output $path
                }
            }
        },
        @{n='ProductId';e={
                if ($_.ProductId)
                {
                    $_.ProductId
                }
                else
                {
                    Write-Output ""
                }
            }
        },
        @{n='Arguments';e={$_.installArguments}},
        @{n='Name';e={$_.Name}}

<######################################################################################################################################################################
    End DscProductArchiveInstaller : 
######################################################################################################################################################################>


<######################################################################################################################################################################
    Begin DscProductPackageInstaller : 
    => Object Model compatible with Custom Dsc Resource cInstallerWrapper
######################################################################################################################################################################>
$global:DscInstallerWrapper = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='ComponentType';e={$_.componentType}},
        @{n='PackageType';e={$_.packageType}},
        @{n='ProductDownload';e={$_ | Select-Object $DscProductDownload}},
        @{n='Package';  e={
                $component = $_
                switch($_.packageType.ToLower())
                {
                    "archive" {
                        $x = $component | Select-Object $DscProductArchiveInstaller
                        Write-Output $x
                    }
                    "package" {
                        $x = $component | Select-Object $DscProductPackageInstaller
                        Write-Output $x
                    }
                    "war" {
                        $x = $component | Select-Object $DscWarInstallerObject
                        Write-Output $x
                    }
                    default {
                        throw New-Object System.Exception "Component Type $($component.componentType) is not implemented. Found on $($component.UniqueKey)"
                    }
                }
            }
         }
<######################################################################################################################################################################
    End DscProductArchiveInstaller : 
######################################################################################################################################################################>


<######################################################################################################################################################################
    Begin DscWindowsService : 
    => Object Model compatible with Builtin Dsc Resource Service
######################################################################################################################################################################>
$global:DscWindowsService = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='ServiceName';e={$_.ServiceName}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='ExecutablePath';e={
                $installationDirectory = Get-Value -Object $_.Folders.InstallationDirectory -Value (Get-FullPath -Object $_.Folders.InstallationDirectory)
                $executablePath = [System.IO.Path]::Combine($installationDirectory, $_.executablePath)
                Write-Output $executablePath
            }
         },
        @{n='ExecutableArguments';e={
                Get-Value -Object $_ -Value $_.ExecutableArguments
            }
         },
        @{n='StartupType';e={
                if ([String]::IsNullOrWhiteSpace($_.StartupType))
                {
                    "Disabled"
                }
                else
                {
                    $_.StartupType
                }
            }
        },
        @{n='State';e={
                if ([String]::IsNullOrWhiteSpace($_.State))
                {
                    "Stopped"
                }
                else
                {
                    $_.State
                }
            }
        }

<######################################################################################################################################################################
    End DscWindowsService : 
######################################################################################################################################################################>

<######################################################################################################################################################################
    Begin DscTomcatInstance : 
    => Object Model compatible with Custom Dsc cTomcatInstaller
######################################################################################################################################################################>
$global:DscTomcatInstance = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='WindowsService';e={
                $_ | Select-Object $global:DscWindowsService
            }
         },
        @{n='Catalina_Base';e={
                Get-Value -Object $_.Folders.'catalina.base' -Value (Get-FullPath -Object $_.Folders.'catalina.base')
            }
         },
        @{n='Catalina_Home';e={
                Get-Value -Object $_.Folders.'catalina.base' -Value (Get-FullPath -Object $_.Folders.'catalina.home')
            }
         },
        @{n='Registry';e={
                $AlldscRegistries = $_.Registry | Select-Object $global:DscRegistryObject 
                Merge-Registry -Registries $AlldscRegistries
            }
         }


<######################################################################################################################################################################
    End DscTomcatInstance : 
######################################################################################################################################################################>



<######################################################################################################################################################################
    Begin DscMiddlewareWrapper : 
    => Object Model compatible with Custom Dsc cTomcatInstaller
######################################################################################################################################################################>

$global:DscMiddlewareWrapper = 
        @{n='UniqueKey';e={$_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='Installers';e={
                #Export Execution Containers
                $_.ExecutionContainers.Values | Sort-Object behaviorType, behaviorKey -Unique | Select-Object $global:DscInstallerWrapper                
            }
         },
        @{n='TomcatInstances';e={
                #Export Execution Containers
                $_.ExecutionContainers.Values | Select-Object $global:DscTomcatInstance
            }
         }

<######################################################################################################################################################################
    End DscTomcatInstance : 
######################################################################################################################################################################>

<######################################################################################################################################################################
    Begin DscConfigurationRepositoryObject : 
    => Object Model compatible with Builtin Dsc Resource File
######################################################################################################################################################################>
$global:DscConfigurationRepositoryObject =
        @{n='UniqueKey';e={Calculate-ConfigurationFullQualifiedUniqueKey -currentObject $_}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='Type';e={
                if ($_.Parent.ElementType -eq 'folder') {"Directory"}
                else {"File"}
            }
         },
        @{n='ConfigurationRepositoryPath';e={
                #Calculate Relative Path for this component
                $Path = Calculate-ConfigurationLocationPath -CurrentObject $_.Parent
                
                #Get the configuration repository provider
                $DeploymentTarget = Get-DeploymentTarget -CurrentObject $_
                $configurationProvider = Get-ConfigurationRepository -UniqueKey $DeploymentTarget.configurationRepository

                [System.IO.Path]::Combine($configurationProvider.GetLocalFullEnvironmentConfigurationPath($_.Parent), $Path)
                 
            }
         },
        @{n='ConfigurationRepositoryNetworkPath';e={
                #Calculate Relative Path for this component
                $Path = Calculate-ConfigurationLocationPath -CurrentObject $_.Parent
                
                #Get the configuration repository provider
                $DeploymentTarget = Get-DeploymentTarget -CurrentObject $_
                $configurationProvider = Get-ConfigurationRepository -UniqueKey $DeploymentTarget.configurationRepository

                [System.IO.Path]::Combine($configurationProvider.GetNetworkFullEnvironmentConfigurationPath($_.Parent), $Path)
                 
            }
         },
        @{n='LocalConfigurationPath';e={
                #Find the server source directory definition
                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if (-not $sourceDirectory)
                {
                    throw New-Object System.Exception "Missing source directory identified by uniquekey RootSourceDirectory"
                }
                $sourceDirectoryPath = Get-FullPath -Object $sourceDirectory

                
                #Calculate Relative Path for this component
                $Path = Calculate-ConfigurationLocationPath -CurrentObject $_.Parent
                
                #Get the configuration repository provider
                $DeploymentTarget = Get-DeploymentTarget -CurrentObject $_
                $configurationProvider = Get-ConfigurationRepository -UniqueKey $DeploymentTarget.configurationRepository

                [System.IO.Path]::Combine($sourceDirectoryPath, $configurationProvider.GetRelativeRootPath($_.Parent), $deploymentTarget.environment, $Path)
                 
            }
         },
        @{n='LocalConfigurationNetworkPath';e={
                #Find the server source directory definition
                $server = Get-Server -CurrentObject $_
                $sourceDirectory = Get-RootFolder -Server $server -UniqueKey "RootSourceDirectory"
                if (-not $sourceDirectory)
                {
                    throw New-Object System.Exception "Missing source directory identified by uniquekey RootSourceDirectory"
                }

                $networkPath = [System.IO.Path]::Combine("\\",$Server.hostName, $sourceDirectory.share)
                
                #Calculate Relative Path for this component
                $Path = Calculate-ConfigurationLocationPath -CurrentObject $_.Parent
                
                #Get the configuration repository provider
                $DeploymentTarget = Get-DeploymentTarget -CurrentObject $_
                $configurationProvider = Get-ConfigurationRepository -UniqueKey $DeploymentTarget.configurationRepository

                [System.IO.Path]::Combine($networkPath, $configurationProvider.GetRelativeRootPath($_.Parent), $deploymentTarget.environment, $Path)
                 
            }
         },
        @{n='Destination';e={
                #Get the Destination Folder
                Get-Value -Object $_.Parent -Value (Get-FullPath -Object $_.Parent)
            }
         }


<######################################################################################################################################################################
    End DscConfigurationRepositoryObject
######################################################################################################################################################################>



$global:DscSourceControl =
        @{n='UniqueKey';e={Get-Value -Object $_ -Value $_.UniqueKey}},
        @{n='Ensure';e={Get-EnsureStatus -CurrentObject $_}},
        @{n='Url';e={
                $sourceControlRepository = Get-ConfigurationRepository -UniqueKey svnMiddleware
                $relativeUri = Get-Value -Object $_ -Value $_.sourceUri
                $Fulluri = [System.IO.Path]::Combine($sourceControlRepository.uri, $relativeUri)
                $Fulluri.replace("\","/")
            }
         },
        @{n='Path';e={Get-Value -Object $_.Parent -Value (Get-FullPath -Object $_.Parent)}},
        @{n='User';e={
                $sourceControlRepository = Get-ConfigurationRepository -UniqueKey svnMiddleware
                $sourceControlRepository.User
            }
         },
        @{n='password';e={
                $sourceControlRepository = Get-ConfigurationRepository -UniqueKey svnMiddleware
                $sourceControlRepository.Password
            }
         }

